#ifndef VECTOR3_H_
#define VECTOR3_H_
#include <math.h>
#include <iostream>
#include "Vector2.h"

using namespace std;

/*
*	___ vector3 Header___
*
*	Author:		Burim Kameri
*	
*	Describes a Vector in the 3thrd Dimension.
**************************************************************
*/
class Vector3
{
		float _x,_y,_z,_w;
	public:
		//Constructors
		Vector3();
		Vector3( const Vector3& vec );

		Vector3( const Vector2& vec );

		Vector3( float x, float y, float z);

		Vector3( float x, float y, float z, float w );
		
		//Getter/Setter
		float getX() const;

		float getY() const;

		float getZ() const;

		float getW() const;

		void setX(float x);

		void setY(float y);

		void setZ(float z);

		void setW(float w);

		float getAbsolute() const;
		
		float getSquare() const;

		float getAngle( const Vector3& vec2) const;

		void setLength( float length );
		
		Vector3 operator + (const Vector3& vec2) const;
		void operator += (const Vector3& vec2);

		Vector3 operator - (const Vector3& vec2) const;
		void operator -= (const Vector3& vec2);

		float operator * (const Vector3& vec2) const;

		Vector3 operator * (float scalar) const;
		void operator *= (float scalar);

		Vector3 operator / (float scalar) const;
		void operator /= (float scalar);

		Vector3 vecProduct( const Vector3& vec2 ) const;

		bool isNullVector() const;

		Vector3 getNormal() const;

		void normalize();
		
		float componentsSum() const;
		
		Vector3 projectionOn( const Vector3& vec2 ) const;

		friend ostream & operator<< (ostream &o, const Vector3 &vec);
};

/***************************************************************/
#endif
